/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy. */
package cz.vse.adventura.po1715.xskrz00_skrivankova;

import cz.pecinovsky.english.pojj.adv_framework.game_gui.IGameG;
import cz.pecinovsky.english.pojj.adv_framework.game_txt.IGame;

import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.TypeOfScenario;
import cz.pecinovsky.english.pojj.adv_framework.scenario.ScenarioStep;
import cz.pecinovsky.english.pojj.adv_framework.scenario.AScenarioManager;

import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_101;
import cz.pecinovsky.english.pojj.adv_framework.test_util._Test_115;
import cz.vse.adventura.po1715.xskrz00_skrivankova.hra.Hra_Alenka;

import static cz.vse.adventura.po1715.xskrz00_skrivankova.hra.Texty.*;



/*******************************************************************************
 * Třída {@code SprávceKonstanta} slouží jako správce scénářů,
 * které mají prověřit a/nebo demonstrovat správnou funkci plánované hry.
 * Jednotlive scénáře jsou iterovatelné posloupností kroků specifikovaných
 * instancemi třídy <code>ScenarioStep</code> z rámce, do nějž se hra začleňuje.
 * <p>
 * Tato třída poskytuje definice využívající globálních textových konstant.
 *
 * @author Rudolf PECINOVSKY
 * @version 3.00,  22.11.2006
 */
public class SprávceScénářů extends AScenarioManager
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================

    /** Třída, jejíž instance jsou zde spravovány. */
    private final static Class<? extends IGame> TŘÍDA = Hra_Alenka.class;

    /** Jmeno autora dane tridy. */
    private static final String autor = "SKŘIVÁNKOVÁ Zuzana";

    /** X-name autora/autorky scénáře. */
    private static final String xname = "XSKRZ00";

    private static final ScenarioStep UVÍTÁNÍ =
        new ScenarioStep(
            ""
            ,zCELÉ_UVÍTÁNÍ
            ,mOSLAVA
            ,new String[] { mFOAYE, mZAHRADA_DOMU }
            ,new String[] { oSTOLY, oŽIDLE, oSTEAK}
            ,new String[] {}
            ,TypeOfStep.tsSTART 
            );

//    static { ScenarioStep.setIndex(999); }
//    private static final ScenarioStep UKONČENÍ =
//        new ScenarioStep( pKONEC,
//            zKONEC,
//
//            KUCHYŇ,
//            new String[] { OBÝVÁK, LOŽNICE },
//            new String[] { LEDNIČKA, PAPÍR },
//            new String[] { PIVO },
//            TypeOfStep.tsEND );


    /***************************************************************************
     * Konstruktor plnohodnotné instance třídy {@link ScenarioStep}
     * vyžaduje následující parametry:
     *      String   příkaz;
     *      String   zpráva;
     *      String   prostor;
     *      String[] východy;
     *      String[] předměty;
     *      String[] batoh;
     *      TypeOfStep typTestu;
     */


    /***************************************************************************
     * Základní úspěšný scénář popisující očekávatelný úspěšný průběh hry.
     * Tento scénář není nejkraším možným, takže to vlastně není základní
     * úspěšný scénář, ale ideální nejkratší scénář nevyhovuje některým
     * okrajovým podmínkám zadání (je moc jednoduchý).
     */
    private static final ScenarioStep[] ÚSPĚŠNÝ =
    {
        
        UVÍTÁNÍ,
        new ScenarioStep( 
            pVEZMI + " " + oSTEAK           //Příkaz
            ,zZVEDNUTO + oSTEAK +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU)
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsPICK_UP //Typ příkazu
            ) 
        ,
        new ScenarioStep( 
            pJDI + " " + mFOAYE           //Příkaz
            ,zPŘESUN + mFOAYE +
            String.format(FORMÁT_INFORMACE
            ,mFOAYE
            ,cm(mOSLAVA) 
            ,cm(oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oNOVINY ,oSVÍČKA)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mFOAYE                        //Místnost
            ,new String[] { mOSLAVA}  //Východy
            ,new String[] { oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oNOVINY ,oSVÍČKA }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oNOVINY           //Příkaz
            ,zZVEDNUTO + oNOVINY +
            String.format(FORMÁT_INFORMACE
            ,mFOAYE
            ,cm(mOSLAVA)
            ,cm(oSTOLEK, oBAR, oPOHOVKA, oKRB, oKVĚTINY ,oSVÍČKA)
            ,cm(oSTEAK, oNOVINY)
            )                               //Zpráva
            ,mFOAYE                        //Místnost
            ,new String[] { mOSLAVA}  //Východy
            ,new String[] { oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oSVÍČKA }    //Předměty
            ,new String[] { oSTEAK,oNOVINY }    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            ),
        new ScenarioStep( 
            pJDI + " " + mOSLAVA           //Příkaz
            ,zPŘESUN + mOSLAVA +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU) 
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK, oNOVINY)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK, oNOVINY }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAHRADA_DOMU           //Příkaz
            ,zPŘESUN + mZAHRADA_DOMU +
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oNOVINY)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oNOVINY }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oKVĚTINY           //Příkaz
            ,zBATOH_PLNÝ +
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oNOVINY)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oNOVINY }    //Batoh
            ,TypeOfStep.tsBAG_FULL  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOLOŽ + " " + oNOVINY           //Příkaz
            ,zPOLOŽENO + oNOVINY + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY, oNOVINY)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY, oNOVINY  }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsPUT_DOWN  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oSTROMY          //Příkaz
            ,zTĚŽKÝ_PŘEDMĚT + oSTROMY + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY, oNOVINY)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY, oNOVINY  }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsUNMOVABLE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mNORA           //Příkaz
            ,zPŘESUN + mNORA +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oKLÍČ,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oKLÍČ,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
         new ScenarioStep( 
            pVEZMI + " " + oKLÍČ           //Příkaz
            ,zZVEDNUTO + oKLÍČ +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK, oKLÍČ)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oKLÍČ}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oKLÍČ  + " " + oDVEŘE    //Příkaz
            ,rDVERE_ODEMCENY +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK, oKLÍČ)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oKLÍČ}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOLOŽ + " " + oKLÍČ           //Příkaz
            ,zPOLOŽENO + oKLÍČ +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE, oKLÍČ)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE, oKLÍČ }    //Předměty
            ,new String[] { oSTEAK}    //Batoh
            ,TypeOfStep.tsPUT_DOWN  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oDORTÍK           //Příkaz
            ,zZVEDNUTO + oDORTÍK +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pSNĚZ + " " + oDORTÍK        //Příkaz
            ,rALENKA_ZMENSENA + 
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mPODZEMNI_ZAHRADA        //Příkaz
            ,zPŘESUN + mPODZEMNI_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mPODZEMNI_ZAHRADA
            ,cm(mVPRAVO,mVLEVO,mROVNE) 
            ,cm(oKEŘE,oSTROMY,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mPODZEMNI_ZAHRADA                        //Místnost
            ,new String[] { mVPRAVO,mVLEVO,mROVNE}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mROVNE       //Příkaz
            ,zPŘESUN + mROVNE +
            String.format(FORMÁT_INFORMACE
            ,mROVNE
            ,cm(mZAMECKA_ZAHRADA, mPODZEMNI_ZAHRADA) 
            ,cm(oKEŘE,oSTROMY,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mROVNE                        //Místnost
            ,new String[] { mZAMECKA_ZAHRADA, mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMECKA_ZAHRADA       //Příkaz
            ,zPŘESUN + mZAMECKA_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pPROMLUV + " " + oKRÁLOVNA       //Příkaz
            ,mlKRÁLOVNA +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oMEČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oMEČ,oDVEŘE}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPŘEMÝŠLEJ        //Příkaz
            ,iVEZENI +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oMEČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oMEČ,oDVEŘE}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oSTEAK + " " + oOHNIVÝ_PES        //Příkaz
            ,rOHNIVY_PES_NAKRMEN +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oMEČ,oDVEŘE)
            ,cm(oDORTÍK)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oMEČ,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pVEZMI + " " + oMEČ        //Příkaz
            ,zZVEDNUTO + oMEČ + 
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oDVEŘE)
            ,cm(oDORTÍK, oMEČ)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK, oMEČ}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oMEČ + " " + oDVEŘE       //Příkaz
            ,rVEZENI_DVERE_ODEMCENY +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oDVEŘE)
            ,cm(oDORTÍK, oMEČ)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK, oMEČ}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMEK       //Příkaz
            ,zPŘESUN + mZAMEK +
            String.format(FORMÁT_INFORMACE
            ,mZAMEK
            ,cm(mZAMECKA_ZAHRADA) 
            ,cm(oKRÁLOVNA,oTRŮN)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMEK                        //Místnost
            ,new String[] {mZAMECKA_ZAHRADA}  //Východy
            ,new String[] { oKRÁLOVNA,oTRŮN}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMECKA_ZAHRADA       //Příkaz
            ,zPŘESUN + mZAMECKA_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oMEČ + " " + oDRAK       //Příkaz
            ,rDRAK_PROBODNUT +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pKONEC       //Příkaz
            ,zKONEC +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsEND  //Typ příkazu
            )
    };

    static { ScenarioStep.setIndex(2); }

    /***************************************************************************
     * Základní chybový scénář definující reakce
     * na povinnou sadu chybových stavů.
     */
    private static final ScenarioStep[] CHYBOVÝ =
    {
        
        UVÍTÁNÍ,
        new ScenarioStep( 
            pVEZMI + " " + oSTEAK           //Příkaz
            ,zZVEDNUTO + oSTEAK +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU)
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsPICK_UP //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + "Zahrádka"           //Příkaz
            ,zNENÍ_CIL +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU)
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsBAD_NEIGHBOR //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oNOVINY           //Příkaz
            ,zNENÍ_PŘEDMĚT + oNOVINY +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU)
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsBAD_OBJECT //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mFOAYE           //Příkaz
            ,zPŘESUN + mFOAYE +
            String.format(FORMÁT_INFORMACE
            ,mFOAYE
            ,cm(mOSLAVA) 
            ,cm(oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oNOVINY ,oSVÍČKA)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mFOAYE                        //Místnost
            ,new String[] { mOSLAVA}  //Východy
            ,new String[] { oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oNOVINY ,oSVÍČKA }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oSVÍČKA           //Příkaz
            ,zZVEDNUTO + oSVÍČKA +
            String.format(FORMÁT_INFORMACE
            ,mFOAYE
            ,cm(mOSLAVA)
            ,cm(oSTOLEK, oBAR, oPOHOVKA, oKRB, oKVĚTINY ,oNOVINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mFOAYE                        //Místnost
            ,new String[] { mOSLAVA}  //Východy
            ,new String[] { oSTOLEK, oBAR, oPOHOVKA, oKRB,oKVĚTINY ,oNOVINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            ),
        new ScenarioStep( 
            pJDI + " " + mOSLAVA           //Příkaz
            ,zPŘESUN + mOSLAVA +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU) 
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            ""           //Příkaz
            ,zPRÁZDNÝ_PŘÍKAZ +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU) 
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsEMPTY  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOLOŽ + " " + oNOVINY           //Příkaz
            ,zNENÍ_V_BATOHU + oNOVINY +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU) 
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA}    //Batoh
            ,TypeOfStep.tsNOT_IN_BAG  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAHRADA_DOMU           //Příkaz
            ,zPŘESUN + mZAHRADA_DOMU +
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oKVĚTINY           //Příkaz
            ,zBATOH_PLNÝ +
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsBAG_FULL  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pVEZMI + " " + oSTROMY          //Příkaz
            ,zTĚŽKÝ_PŘEDMĚT + oSTROMY + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsUNMOVABLE  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pVEZMI          //Příkaz
            ,zPŘEDMĚT_NEZADAN + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsPICK_UP_WA  //Typ příkazu
            )
        ,
         new ScenarioStep( 
            pPOLOŽ          //Příkaz
            ,zPŘEDMĚT_NEZADAN + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsPUT_DOWN_WA  //Typ příkazu
            )
        ,
         
         new ScenarioStep( 
            "okurky"          //Příkaz
            ,zNEZNÁMÝ_PŘÍKAZ + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsUNKNOWN  //Typ příkazu
            )
        ,
         new ScenarioStep( 
            pJDI         //Příkaz
            ,zNENÍ_CIL + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsMOVE_WA  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pHELP         //Příkaz
            ,zNÁPOVĚDA + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsHELP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pKONEC         //Příkaz
            ,zKONEC + 
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK, oSVÍČKA)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK, oSVÍČKA }    //Batoh
            ,TypeOfStep.tsEND  //Typ příkazu
            )
        
    };


    static { ScenarioStep.setIndex(2); }

    /***************************************************************************
     * Nejkraší možný scénář vedoucí k úspěšnému dokončení hry.
     * Teoreticky by měl být základním úspěšným,
     * ale nevyhovuje nětkerým požadavkům zadání,
     * tak je zařazen jako dodatečný kontrolovatelný scénář.
     */
    private static final ScenarioStep[] NEJKRATŠÍ =
    {
        
        UVÍTÁNÍ,
        new ScenarioStep( 
            pVEZMI + " " + oSTEAK           //Příkaz
            ,zZVEDNUTO + oSTEAK +
            String.format(FORMÁT_INFORMACE
            ,mOSLAVA
            ,cm(mFOAYE, mZAHRADA_DOMU)
            ,cm(oSTOLY, oŽIDLE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mOSLAVA                        //Místnost
            ,new String[] { mFOAYE, mZAHRADA_DOMU}  //Východy
            ,new String[] { oSTOLY, oŽIDLE }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsPICK_UP //Typ příkazu
            ) 
        ,
        new ScenarioStep( 
            pJDI + " " + mZAHRADA_DOMU           //Příkaz
            ,zPŘESUN + mZAHRADA_DOMU +
            String.format(FORMÁT_INFORMACE
            ,mZAHRADA_DOMU
            ,cm(mOSLAVA, mNORA) 
            ,cm(oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mZAHRADA_DOMU                        //Místnost
            ,new String[] { mOSLAVA, mNORA}  //Východy
            ,new String[] { oSTROMY,oKEŘE,oKRÁLÍK,oKVĚTINY }    //Předměty
            ,new String[] { oSTEAK }    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mNORA           //Příkaz
            ,zPŘESUN + mNORA +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oKLÍČ,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oKLÍČ,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
         new ScenarioStep( 
            pVEZMI + " " + oKLÍČ           //Příkaz
            ,zZVEDNUTO + oKLÍČ +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK, oKLÍČ)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oKLÍČ}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oKLÍČ  + " " + oDVEŘE    //Příkaz
            ,rDVERE_ODEMCENY +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE)
            ,cm(oSTEAK, oKLÍČ)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oKLÍČ}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOLOŽ + " " + oKLÍČ           //Příkaz
            ,zPOLOŽENO + oKLÍČ +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oDORTÍK, oDVEŘE, oKLÍČ)
            ,cm(oSTEAK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oDORTÍK,oDVEŘE, oKLÍČ }    //Předměty
            ,new String[] { oSTEAK}    //Batoh
            ,TypeOfStep.tsPUT_DOWN  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pVEZMI + " " + oDORTÍK           //Příkaz
            ,zZVEDNUTO + oDORTÍK +
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE }    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pSNĚZ + " " + oDORTÍK        //Příkaz
            ,rALENKA_ZMENSENA + 
            String.format(FORMÁT_INFORMACE
            ,mNORA
            ,cm(mPODZEMNI_ZAHRADA) 
            ,cm(oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mNORA                        //Místnost
            ,new String[] { mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oSTOLEK,oLAHVIČKA,oKLÍČ,oDVEŘE}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mPODZEMNI_ZAHRADA        //Příkaz
            ,zPŘESUN + mPODZEMNI_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mPODZEMNI_ZAHRADA
            ,cm(mVPRAVO,mVLEVO,mROVNE) 
            ,cm(oKEŘE,oSTROMY,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mPODZEMNI_ZAHRADA                        //Místnost
            ,new String[] { mVPRAVO,mVLEVO,mROVNE}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mROVNE       //Příkaz
            ,zPŘESUN + mROVNE +
            String.format(FORMÁT_INFORMACE
            ,mROVNE
            ,cm(mZAMECKA_ZAHRADA, mPODZEMNI_ZAHRADA) 
            ,cm(oKEŘE,oSTROMY,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mROVNE                        //Místnost
            ,new String[] { mZAMECKA_ZAHRADA, mPODZEMNI_ZAHRADA}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMECKA_ZAHRADA       //Příkaz
            ,zPŘESUN + mZAMECKA_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pPROMLUV + " " + oKRÁLOVNA       //Příkaz
            ,mlKRÁLOVNA +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oMEČ,oDVEŘE)
            ,cm(oSTEAK, oDORTÍK)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oMEČ,oDVEŘE}    //Předměty
            ,new String[] { oSTEAK, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oSTEAK + " " + oOHNIVÝ_PES        //Příkaz
            ,rOHNIVY_PES_NAKRMEN +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oMEČ,oDVEŘE)
            ,cm(oDORTÍK)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oMEČ,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        
        new ScenarioStep( 
            pVEZMI + " " + oMEČ        //Příkaz
            ,zZVEDNUTO + oMEČ + 
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oDVEŘE)
            ,cm(oDORTÍK, oMEČ)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK, oMEČ}    //Batoh
            ,TypeOfStep.tsPICK_UP  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oMEČ + " " + oDVEŘE       //Příkaz
            ,rVEZENI_DVERE_ODEMCENY +
            String.format(FORMÁT_INFORMACE
            ,mVEZENI
            ,cm(mZAMEK) 
            ,cm(oOHNIVÝ_PES,oDVEŘE)
            ,cm(oDORTÍK, oMEČ)
            )                               //Zpráva
            ,mVEZENI                        //Místnost
            ,new String[] {mZAMEK}  //Východy
            ,new String[] { oOHNIVÝ_PES,oDVEŘE}    //Předměty
            ,new String[] {oDORTÍK, oMEČ}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMEK       //Příkaz
            ,zPŘESUN + mZAMEK +
            String.format(FORMÁT_INFORMACE
            ,mZAMEK
            ,cm(mZAMECKA_ZAHRADA) 
            ,cm(oKRÁLOVNA,oTRŮN)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMEK                        //Místnost
            ,new String[] {mZAMECKA_ZAHRADA}  //Východy
            ,new String[] { oKRÁLOVNA,oTRŮN}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pJDI + " " + mZAMECKA_ZAHRADA       //Příkaz
            ,zPŘESUN + mZAMECKA_ZAHRADA +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsMOVE  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pPOUŽIJ + " " + oMEČ + " " + oDRAK       //Příkaz
            ,rDRAK_PROBODNUT +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsNON_STANDARD  //Typ příkazu
            )
        ,
        new ScenarioStep( 
            pKONEC       //Příkaz
            ,zKONEC +
            String.format(FORMÁT_INFORMACE
            ,mZAMECKA_ZAHRADA
            ,cm(mROVNE, mZAMEK) 
            ,cm(oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY)
            ,cm(oMEČ, oDORTÍK)
            )                               //Zpráva
            ,mZAMECKA_ZAHRADA                        //Místnost
            ,new String[] {mROVNE, mZAMEK}  //Východy
            ,new String[] { oKEŘE,oSTROMY,oKRÁLOVNA,oDRAK,oŠKLEB,oKVĚTINY}    //Předměty
            ,new String[] { oMEČ, oDORTÍK}    //Batoh
            ,TypeOfStep.tsEND  //Typ příkazu
            )
        
    };


    /***************************************************************************
     * Příkazy pro demonstrační scénář sloužící k analýze funkce
     * grafického uživatelského rozhraní.
     * Scénář má za úkol projít jeméně třemi místnostmi,
     * zvednout nejméně dva objekty a položit je v jiné místnosti,
     * než ve které je zvedal.
     * Příkazy pro demonstrační scénář neobsahuje úvodní prázdný příkaz,
     * ten si konstruktor scénáře doplní sám.
     */
    String[] demonstrační = {
            
            pVEZMI + " " + oSTEAK,
            pJDI   + " " + mZAHRADA_DOMU,
            pJDI   + " " + mNORA,
            pVEZMI + " " + oKLÍČ,
            pPOUŽIJ   + " " + oKLÍČ + " " + oDVEŘE,
            pPOLOŽ + " " + oKLÍČ,
            pVEZMI   + " " + oDORTÍK,
            pSNĚZ + " " + oDORTÍK,
            pJDI + " " + mPODZEMNI_ZAHRADA,
            pKONEC
         
    };


    /** Jediná instance této třídy. Spravuje všechny scénáře sdružené hry. */
    private static final SprávceScénářů SS = new SprávceScénářů();



//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vrátí správce scénářů - jedinou instanci této třídy.
     *
     * @return Správce scénářů
     */
    public static SprávceScénářů getInstance()
    {
        return SS;
    }


    /***************************************************************************
     * Vytvoří instanci představující správce scénářů hry.
     */
    public SprávceScénářů()
    {
        super(autor, xname, TŘÍDA);

        addScenario("Úspěšný",      TypeOfScenario.scHAPPY,    ÚSPĚŠNÝ);
        addScenario("Chybový",      TypeOfScenario.scMISTAKES, CHYBOVÝ);
        addScenario("Nejkratší",    TypeOfScenario.scGENERAL,  NEJKRATŠÍ);
        addScenario("Demo for GUI",  demonstrační);
        
        
        seal();
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTOVACÍ METODY A TŘÍDY ==================================================

    /***************************************************************************
     * Základní test ověřující, jestli správce scénářů vyhovuje
     * zadným okrajovým podmínkám.
     */
    public static void testSprávceScénářů()
    {
        _Test_101 test = _Test_101.getInstance(SS);
        test.testScenarioManager();
    }


    /***************************************************************************
     * Testování funkce hry prováděné postupně
     * prostřednictvím všech scénářů daného správce
     */
    public static void prověrkaHry()
    {
        IGame     hra  = (IGameG)SS.getGame();
        _Test_101 test = _Test_101.getInstance(hra);
        test.testGame();
    }


    /***************************************************************************
     * Test ověřujícífunkci textové verze hry.
     */
    public static void testTXT()
    {
        IGame     hra  = Hra_Alenka.getHra();
        _Test_101 test = _Test_101.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /***************************************************************************
     * Test demonstrující hraní hry na daném GUI.
     */
    public static void testGUI()
    {
        IGameG    hra  = (IGameG)SS.getGame();
        _Test_115 test = _Test_115.getInstance(hra);
        test.playGameByScenario(INDEX_GUI_TEST);
    }


    /** @param args Parametry příkazového řádku - nepoužívané. */
    public static void main( String[] args )
    {
       // testSprávceScénářů();
        //testTXT();
        SS.setGame(Hra_Alenka.getHra());
       prověrkaHry();
    }
}
